home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
FishMarket 1.0
/
FishMarket v1.0.iso
/
fishies
/
301-325
/
disk_321
/
turtle
/
sources
/
turtlelibrary.asm
< prev
Wrap
Assembly Source File
|
1992-05-06
|
15KB
|
717 lines
;
; Turtle-Library V3.0
;
; 04.01.90
;
; Thomas Albers
;
INCDIR "DevpacAm:include/"
INCLUDE "exec.offsets"
INCLUDE "graphics.offsets"
INCLUDE "mathffp.offsets"
INCLUDE "mathtrans.offsets"
INCLUDE "exec/types.i"
INCLUDE "exec/alerts.i"
INCLUDE "exec/initializers.i"
INCLUDE "exec/libraries.i"
INCLUDE "exec/lists.i"
INCLUDE "exec/resident.i"
INCLUDE "graphics/rastport.i"
ExecBase = 4
;TurtleBase
STRUCTURE TurtleBase,LIB_SIZE
ULONG tb_SegList ;pointer to Segment List,
ULONG tb_GfxBase ; to Graphics Library,
ULONG tb_FFPBase ; to MathFFP Library,
ULONG tb_FFPTBase ; and to MathTrans Library
LABEL TurLib_SIZEOF
;TurtleHandle
STRUCTURE TurtleHandle,0
APTR th_RastPort ;pointer to RastPort
FLOAT th_xPosition ;x Position (FFP)
FLOAT th_yPosition ;y Position (FFP)
UWORD th_angle ;angle of Turtle
UWORD th_xStart ;initial x
UWORD th_yStart ;initial y
UWORD th_aStart ;initial angle
UBYTE th_Flags ;flags
UBYTE th_FlagStart ;initial flags
STRUCT th_PointArray,12 ;points of Turtle triangle
LABEL TurtleHandle_SIZEOF
;Flags
BITDEF Tur,Hide,0 ;turtle hidden
BITDEF Tur,Up,1 ;pen Up
BITDEF Tur,xComp,2 ;x compression
BITDEF Tur,yComp,3 ;y compression
BITDEF Tur,TValid,7 ;triangle valid
;if someone tried to run this
Start:
MOVEQ #0,D0
RTS
Priority = 0
Version = 3
Revision = 2
;Resident structure for Library
Resident:
DC.W RTC_MATCHWORD ;magic value
DC.L Resident ;pointer to beginning
DC.L EndCode ; and end of structure
DC.B RTF_AUTOINIT ;type
DC.B Version ;version
DC.B NT_LIBRARY ;node type
DC.B Priority ;priority
DC.L TurtName ;library name
DC.L InfoStrg ;info string
DC.L InitData ;initialisisation data
TurtName DC.B "turtle.library",0
InfoStrg DC.B "turtle.library V3.2 (04 Jan 1990) by Thomas Albers",13,10,0
GfxName DC.B "graphics.library",0
FFPName DC.B "mathffp.library",0
FFPTName DC.B "mathtrans.library",0
EVEN
InitData:
DC.L TurLib_SIZEOF ;size of Library base
DC.L FuncTable ;function table
DC.L DataTable ;table for InitStruct
DC.L LibInit ;initialisation routine
FuncTable:
DC.L Open
DC.L Close
DC.L Expunge
DC.L ExtFunc
DC.L CreateTurtle
DC.L ReturnTurtle
DC.L TurnLeft
DC.L TurnRight
DC.L PenUp
DC.L PenDown
DC.L HideTurtle
DC.L ShowTurtle
DC.L SetAngle
DC.L SetPosition
DC.L ResetTurtle
DC.L Forward
DC.L -1
DataTable:
INITBYTE LN_TYPE,NT_LIBRARY
INITLONG LN_NAME,TurtName
INITBYTE LIB_FLAGS,LIBF_SUMUSED|LIBF_CHANGED
INITWORD LIB_VERSION,Version
INITWORD LIB_REVISION,Revision
INITLONG LIB_IDSTRING,InfoStrg
DC.L 0
LibInit:
;This routine is called after the library has been loaded from disk
;D0: Pointer to Library
;A0: Pointer to Segment list
MOVEM.L A5-A6,-(SP)
MOVE.L ExecBase,A6
MOVE.L D0,A5 ;pointer to Library
MOVE.L A0,tb_SegList(A5) ;save pointer to Segment list
LEA GfxName,A1 ;open Graphics Library
MOVEQ #0,D0
JSR _LVOOpenLibrary(A6)
MOVE.L D0,tb_GfxBase(A5)
BEQ.S .LibIni1 ;error?
LEA FFPName,A1 ;open MathFFP Library
MOVEQ #0,D0
JSR _LVOOpenLibrary(A6)
MOVE.L D0,tb_FFPBase(A5)
BEQ.S .LibIni2 ;error?
LEA FFPTName,A1 ;open MathTrans Library
MOVEQ #0,D0
JSR _LVOOpenLibrary(A6)
MOVE.L D0,tb_FFPTBase(A5)
BEQ.S .LibIni3 ;error?
MOVE.L A5,D0 ;allright, return Pointer to Library
MOVEM.L (SP)+,A5-A6
RTS
.LibIni3 MOVE.L tb_FFPBase(A5),A1 ;error, close Libraries
JSR _LVOCloseLibrary(A6)
.LibIni2 MOVE.L tb_GfxBase(A5),A1
JSR _LVOCloseLibrary(A6)
.LibIni1 CLR.L D0 ;and return 0
MOVEM.L (SP)+,A5-A6
RTS
Open:
;This routine is called each time when the library is opened
;A6: Pointer to Library
ADDQ.W #1,LIB_OPENCNT(A6) ;increase Open count
BCLR #LIBB_DELEXP,LIB_FLAGS(A6) ;no Delayed Expunge
MOVE.L A6,D0 ;return pointer to Library
RTS
Close:
;This routine gets called each time the library is closed
;A6: Pointer to Library
SUBQ.W #1,LIB_OPENCNT(A6) ;decrease Open count
BNE.S .Clos1 ;still open
BTST #LIBB_DELEXP,LIB_FLAGS(A6) ;Delayed Expunge?
BNE.S Expunge ;yes, do it
.Clos1 CLR.L D0 ;return 0 (no Expunge)
RTS
Expunge:
;This routine is used to clear the library from memory
;A6: Pointer to Library
TST.W LIB_OPENCNT(A6) ;library still open?
BEQ.S .Expung1 ;no, remove it
BSET #LIBB_DELEXP,LIB_FLAGS(A6) ;set Delayed Expunge flag
CLR.L D0 ;and return 0
RTS
.Expung1 MOVEM.L D2-D3/A4-A6,-(SP)
MOVE.L A6,A5 ;pointer to library
MOVE.L ExecBase,A6
MOVE.L tb_SegList(A5),D2 ;pointer to Segment list
MOVEQ #8,D3 ;close Libraries
.Expung2 MOVE.L tb_GfxBase(A5,D3.W),A1
JSR _LVOCloseLibrary(A6)
SUBQ.W #4,D3
BPL.S .Expung2
MOVE.L A5,A1 ;remove library from library list
JSR _LVORemove(A6)
CLR.L D0
MOVE.L A5,A1
MOVE.W LIB_NEGSIZE(A5),D0
SUB.L D0,A1 ;pointer to beginning of library
ADD.W LIB_POSSIZE(A5),D0 ;length
JSR _LVOFreeMem(A6) ;return memory
MOVE.L D2,D0 ;return pointer to Segment list
MOVEM.L (SP)+,D2-D3/A5-A6
RTS
ExtFunc:
;unused function
MOVEQ #0,D0
RTS
CreateTurtle:
;create TurtleHandle
;
;A0: pointer to RastPort
;D0: x position
;D1: y position
;D2: angle
;D3: flags
MOVEM.L D0-D3/A0/A4-A6,-(SP)
MOVE.L A6,A5
MOVE.L ExecBase,A6
MOVEQ #TurtleHandle_SIZEOF,D0 ;allocate memory
MOVEQ #0,D1
JSR _LVOAllocMem(A6)
TST.L D0 ;error?
BEQ.S .Create1 ;yes, return
MOVE.L D0,A4 ;pointer to memory
MOVE.L tb_FFPBase(A5),A6
MOVE.L 16(SP),th_RastPort(A4) ;store pointer to RastPort
MOVE.W 10(SP),th_angle(A4) ; and angle in Handle
MOVE.W 10(SP),th_aStart(A4)
MOVE.B 15(SP),D0 ;flags
BCLR #TurB_TValid,D0 ;clear Triangle Valid flag
MOVE.B D0,th_Flags(A4) ;and store it
MOVE.B D0,th_FlagStart(A4)
MOVE.W 2(SP),D0 ;x position
MOVE.W D0,th_xStart(A4) ;as initial position in Handle
EXT.L D0
JSR _LVOSPFlt(A6) ;to FFP
MOVE.L D0,th_xPosition(A4) ;as actual position
MOVE.W 6(SP),D0 ;y position
MOVE.W D0,th_yStart(A4)
EXT.L D0
JSR _LVOSPFlt(A6)
MOVE.L D0,th_yPosition(A4)
MOVE.L A4,A0 ;draw triangle
MOVE.L A5,A6
BSR DrawTurtle
MOVE.L A4,D0 ;return pointer to TurtleHandle
.Create1 ADDQ.L #8,SP
MOVEM.L (SP)+,D2-D3/A0/A4-A6
RTS
ReturnTurtle:
;return TurtleHandle
;
;A0: Zeiger auf Handle
MOVE.L A6,-(SP)
BSR DrawTurtle ;clear triangle
MOVE.L ExecBase,A6
MOVE.L A0,A1 ;and return memory
MOVEQ #TurtleHandle_SIZEOF,D0
JSR _LVOFreeMem(A6)
MOVE.L (SP)+,A6
RTS
TurnRight:
;turn Turtle to the right (negative)
;
;A0: pointer to Turtlehandle
;D0: angle
NEG.W D0 ;change sign
;und weiter bei TurnLeft
TurnLeft:
;turn Turtle to the left (positive)
;
;A0: pointer to Turtlehandle
;D0: angle
BSR DrawTurtle ;clear triangle
ADD.W th_Angle(A0),D0 ;new angle
EXT.L D0
DIVS #360,D0 ;mod 360
SWAP D0 ;remainder
TST.W D0 ;positiv?
BPL.S .TurnRi1 ;yes
ADD.W #360,D0 ;no, make positive
.TurnRi1 MOVE.W D0,th_Angle(A0) ;save angle
BCLR #TurB_TValid,th_Flags(A0) ;triangle invalid
BRA DrawTurtle ;new triangle
PenUp:
;Pen up
;
;A0: pointer to TurtleHandle
;
BSET #TurB_Up,th_Flags(A0) ;set Pen Up flag
RTS
PenDown:
;Pen down
;
;A0: pointer to TurtleHandle
;
BCLR #TurB_Up,th_Flags(A0) ;clear Pen Up flag
RTS
HideTurtle:
;Hide Turtle triangle
;
;A0: pointer to TurtleHandle
;
BTST #TurB_Hide,th_Flags(A0) ;already hidden?
BNE.S .HideTu1 ;yes
BSR DrawTurtle ;clear triangle
BSET #TurB_Hide,th_Flags(A0) ;set Hide Turtle flag
.HideTu1 RTS
ShowTurtle:
;Show Turtle triangle
;
;A0: pointer to TurtleHandle
;
BCLR #TurB_Hide,th_Flags(A0) ;clear Hide Turtle flag
BEQ.S .ShowTu1 ;already cleared
BCLR #TurB_TValid,th_Flags(A0) ;triangle invalid
BSR DrawTurtle ;draw it
.ShowTu1 RTS
SetAngle:
;Set Turtle angle
;
;A0: pointer to TurtleHandle
;D0: new angle
;
BSR DrawTurtle ;clear triangle
MOVE.W D0,th_Angle(A0) ;new angle
BCLR #TurB_TValid,th_Flags(A0) ;triangle invalid
BRA DrawTurtle ;draw it
SetPosition:
;Set Turtle position
;
;A0: Zeiger auf Turtlehandle
;D0: x position
;D1: y position
;
MOVEM.L D0-D1/A4-A6,-(SP)
BSR DrawTurtle ;clear triangle
MOVE.L A0,A4 ;TurtleHandle
MOVE.L A6,A5
MOVE.L tb_FFPBase(A5),A6 ;FFP Library
MOVE.W 2(SP),D0 ;x position
EXT.L D0
JSR _LVOSPFlt(A6) ;to FFP
MOVE.L D0,th_xPosition(A4) ;save it
MOVE.W 6(SP),D0 ;y-Position
EXT.L D0
JSR _LVOSPFlt(A6)
MOVE.L D0,th_yPosition(A4)
MOVE.L A5,A6
BCLR #TurB_TValid,th_Flags(A4) ;triangle invalid
BSR DrawTurtle ;draw it
ADDQ.L #8,SP
MOVEM.L (SP)+,A4-A6
RTS
ResetTurtle:
;Reset Turtle to initial state
;
;A0: pointer to TurtleHandle
;
MOVEM.L A4-A6,-(SP)
BSR DrawTurtle ;clear triangle
MOVE.L A0,A4 ;pointer to TurtleHandle
MOVE.L A6,A5
MOVE.L tb_FFPBase(A5),A6
MOVE.W th_aStart(A4),th_Angle(A4) ;set angle and flags to initial values
MOVE.B th_FlagStart(A4),th_Flags(A4)
MOVE.W th_xStart(A4),D0 ;initial x position
EXT.L D0
JSR _LVOSPFlt(A6) ;to FFP
MOVE.L D0,th_xPosition(A4) ;actual x position
MOVE.W th_yStart(A4),D0 ;initial y position
EXT.L D0
JSR _LVOSPFlt(A6)
MOVE.L D0,th_yPosition(A4)
MOVE.L A5,A6
BSR DrawTurtle ;draw triangle
MOVEM.L (SP)+,A4-A6
RTS
Forward:
;Move Turtle
;
;A0: pointer to TurtleHandle
;D0: distance (FFP)
;
MOVEM.L D2-D6/A2-A3/A5-A6,-(SP)
MOVE.L D0,D2 ;distance
MOVE.L A0,A2 ;TurtleHandle
MOVE.L A6,A5 ;library
BSR DrawTurtle ;clear triangle
MOVE.L tb_FFPBase(A5),A6
MOVE.W th_Angle(A2),D0 ;convert angle
EXT.L D0
JSR _LVOSPFlt(A6) ;to FFP
MOVE.L #$8EFA353B,D1 ; (pi/180)
JSR _LVOSPMul(A6) ;and to radians
MOVE.L tb_FFPTBase(A5),A6
SUBQ.L #4,SP ;space for cosine on stack
MOVE.L SP,D1
JSR _LVOSPSinCos(A6)
MOVE.L D0,D5 ;sine
MOVE.L (SP)+,D6 ;cosine
MOVE.L tb_FFPBase(A5),A6
MOVE.L D2,D1 ;y component of distance:
JSR _LVOSPMul(A6) ; yd := d * sin w
MOVE.L D0,D1
MOVE.L th_yPosition(A2),D0 ;y position:
JSR _LVOSPSub(A6) ; yp := yp-yd
MOVE.L D0,D3
MOVE.L D6,D0 ;x component of distance:
MOVE.L D2,D1 ; xd := d * cos w
JSR _LVOSPMul(A6)
MOVE.L th_xPosition(A2),D1 ;x position:
JSR _LVOSPAdd(A6) ; xp := xp+xd
MOVE.L D0,D2
BTST #TurB_Up,th_Flags(A2) ;Pen up?
BNE.S .Forwar1 ;yes
MOVE.L th_RastPort(A2),A3 ;Rastport
MOVE.L th_yPosition(A2),D0 ;convert old position to integer
JSR _LVOSPFix(A6)
MOVE.L D0,D4
MOVE.L th_xPosition(A2),D0
JSR _LVOSPFix(A6)
MOVE.L tb_GfxBase(A5),A6
MOVE.L A3,A1 ;graphics cursor to old position
MOVE.L D4,D1
JSR _LVOMove(A6)
MOVE.L tb_FFPBase(A5),A6
MOVE.L D3,D0 ;convert new position to integer
JSR _LVOSPFix(A6)
MOVE.L D0,D4
MOVE.L D2,D0
JSR _LVOSPFix(A6)
MOVE.L tb_GfxBase(A5),A6
MOVE.L A3,A1 ;draw line
MOVE.L D4,D1
JSR _LVODraw(A6)
.Forwar1 MOVE.L D2,th_xPosition(A2) ;save new position
MOVE.L D3,th_yPosition(A2)
BTST #TurB_Hide,th_Flags(A2) ;triangle visible?
BNE.S .Forwar2 ;no
MOVE.L tb_FFPBase(A5),A6 ;yes, calculate coordinates
BSR.S CalcTurtle
MOVE.L A2,A0 ;and draw it
MOVE.L A5,A6
BSR DrawTurtle
.Forwar2 MOVEM.L (SP)+,D2-D6/A2-A3/A5-A6
RTS
CalcTurtle:
;calculate points of Turtle triangle
;
;D2: x position (FFP)
;D3: y position (FFP)
;D5: sine
;D6: cosine
;A2: pointer to TurtleHandle
;A6: pointer to MathFFP library
;
;This function is private and is not contained in the jump table
;
;Do take care! Register contents are changed!
;
MOVE.L D2,D0 ;convert position to integer
JSR _LVOSPFix(A6)
MOVE.W D0,th_PointArray+4(A2)
MOVE.L D3,D0
JSR _LVOSPFix(A6)
MOVE.W D0,th_PointArray+6(A2) ;2nd point
MOVE.L D2,D0 ;x position
MOVE.L D6,D1
ADDQ.B #3,D1 ; cos*8
BTST #TurB_xComp,th_Flags(A2) ; x compression?
BEQ.S .CalcTu1 ; no
SUBQ.B #1,D1 ; cos*4
.CalcTu1 JSR _LVOSPSub(A6) ;xpos - c*cos
MOVE.L D0,D2 ;as x coordinate of center of baseline
MOVE.L D3,D0 ;y position
MOVE.L D5,D1
ADDQ.B #3,D1 ; sin*8
BTST #TurB_yComp,th_Flags(A2) ; y compression?
BEQ.S .CalcTu2 ; no
SUBQ.B #1,D1 ; sin*4
.CalcTu2 JSR _LVOSPAdd(A6) ;ypos - c*sin
MOVE.L D0,D3 ;as y coordinate of center of baseline
MOVE.L D2,D0 ;x center
MOVE.L D5,D1
ADDQ.B #2,D1 ; sin*4
BTST #TurB_xComp,th_Flags(A2) ; x compression?
BEQ.S .CalcTu3 ; no
SUBQ.B #1,D1 ; sin*2
.CalcTu3 MOVE.L D1,D4 ; save sine
JSR _LVOSPSub(A6) ;x center - sin
JSR _LVOSPFix(A6) ;to integer
MOVE.W D0,th_PointArray+0(A2) ;x coordinate of 1st point
MOVE.L D2,D0
MOVE.L D4,D1
JSR _LVOSPAdd(A6) ;x center + sin
JSR _LVOSPFix(A6)
MOVE.W D0,th_PointArray+8(A2) ;x coordinate of 3rd point
MOVE.L D3,D0 ;y center
MOVE.L D6,D1
ADDQ.B #2,D1
BTST #TurB_yComp,th_Flags(A2)
BEQ.S .CalcTu4
SUBQ.B #1,D1
.CalcTu4 MOVE.L D1,D4
JSR _LVOSPSub(A6) ;y center - cos
JSR _LVOSPFix(A6)
MOVE.W D0,th_PointArray+2(A2) ;y coordinate of 1st point
MOVE.L D3,D0
MOVE.L D4,D1
JSR _LVOSPAdd(A6) ;y center + cos
JSR _LVOSPFix(A6)
MOVE.W D0,th_PointArray+10(A2) ;y coordinate of 3rd point
BSET #TurB_TValid,th_Flags(A2) ;triangle valid
RTS
DrawTurtle:
;draw Turtle triangle
;
;A0: pointer to TurtleHandle
;
;This function is provate and not contained in the jump table
;
;Register contents are not changed!
;
BTST #TurB_Hide,th_Flags(A0) ;triangle hidden?
BEQ.S .DrawTu2 ;no, draw it
RTS
.DrawTu2 MOVEM.L D0-D6/A0-A3/A5-A6,-(SP)
MOVE.L A0,A2 ;TurtleHandle
MOVE.L th_RastPort(A2),A3 ;RastPort
MOVE.L A6,A5 ;Library Base
BTST #TurB_TValid,th_Flags(A2) ;triangle valid?
BNE.S .DrawTu1 ;yes
MOVE.L tb_FFPBase(A5),A6
MOVE.W th_Angle(A2),D0 ;convert angle
EXT.L D0
JSR _LVOSPFlt(A6)
MOVE.L #$8EFA353B,D1 ;to radians
JSR _LVOSPMul(A6)
MOVE.L tb_FFPTBase(A5),A6
SUBQ.L #4,SP
MOVE.L SP,D1
JSR _LVOSPSinCos(A6)
MOVE.L D0,D5 ;sine to D5,
MOVE.L (SP)+,D6 ;cosine to D6
MOVE.L th_xPosition(A2),D2 ;x position to D2
MOVE.L th_yPosition(A2),D3 ;y position to D3
MOVE.L tb_FFPBase(A5),A6 ;calculate points
BSR CalcTurtle
.DrawTu1 MOVE.L tb_GfxBase(A5),A6
MOVE.B rp_FgPen(A3),-(SP) ;save FgPen and DrawMode of RastPort
MOVE.B rp_DrawMode(A3),-(SP)
MOVE.L A3,A1 ;draw into all planes
MOVEQ #-1,D0
JSR _LVOSetAPen(A6)
MOVE.L A3,A1 ;new DrawMode
MOVEQ #RP_JAM1|RP_COMPLEMENT,D0
JSR _LVOSetDrMd(A6)
MOVE.L A3,A1 ;graphics cursor to 1st point
MOVE.W th_PointArray+0(A2),D0
MOVE.W th_PointArray+2(A2),D1
JSR _LVOMove(A6)
MOVE.L A3,A1 ;draw triangle
MOVEQ #2,D0
LEA th_PointArray+4(A2),A0
JSR _LVOPolyDraw(A6)
MOVE.L A3,A1 ;restore DrawMode
MOVE.B (SP)+,D0
JSR _LVOSetDrMd(A6)
MOVE.L A3,A1 ;and FgPen
MOVE.B (SP)+,D0
JSR _LVOSetAPen(A6)
MOVEM.L (SP)+,D0-D6/A0-A3/A5-A6
RTS
EndCode: